package org.hzero.business;

import io.choerodon.core.domain.Page;
import io.choerodon.core.domain.PageInfo;
import io.choerodon.mybatis.pagehelper.domain.PageRequest;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.List;

/**
 * @ClassName: DoPageUtil
 * @Description: 对List分页的工具类
 * @author: tianhao.luo@hand-china.com
 * @date: 2020/9/19  14:05
 */
public final class KnifePageUtil {

    /**
     * 分页工具
     *
     * 第二种方式比第一种方式总的来说要快一点
     * @param pageRequest 分页请求
     * @param list 待分页的list
     * @param <T> 占位符
     * @return 分页好的list
     */
    @SuppressWarnings("unchecked")
    public static <T> Page<T> doPage(PageRequest pageRequest, List<T> list){

        // ========================================
        // 第一种方式
        // ========================================

        /**
         * 第一种方式：一千万数据测试在测试类中测试，花费时间16ms
         * {@link org.hzero.business.KnifePageUtilTest}
         */
        //Assert.notNull(pageRequest,"分页请求不能为空！");
        //Assert.notNull(list,"待分页的list不能为空！");
        //PageInfo pageInfo = new PageInfo(pageRequest.getPage(), pageRequest.getSize());
        //ArrayList<T> arrayList = new ArrayList<>(pageRequest.getSize());
        ////当list的记录 大于 当前请求页的最后一个记录的序号时，从记录数据中截取size个元素用来返回，所以小size即可
        //if (pageRequest.getSize()*(pageRequest.getPage()+1)<list.size()){
        //    for (int i = (pageRequest.getPage() * pageRequest.getSize()); i < (pageRequest.getSize() * (pageRequest.getPage() + 1)); i++) {
        //        arrayList.add(list.get(i));
        //    }
        //}else {
        //    for (int i = pageRequest.getPage() * pageRequest.getSize(); i < list.size(); i++) {
        //        arrayList.add(list.get(i));
        //    }
        //}
        //return new Page<T>(arrayList, pageInfo
        //        , list.size());

        // ========================================
        // 第二种测试
        // ========================================

        /**
         * 第二种方式：一千万数据测试在测试类中测试，花费时间15ms
         * {@link org.hzero.business.KnifePageUtilTest}
         */
        Assert.notNull(pageRequest,"分页请求不能为空！");
        Assert.notNull(list,"待分页的list不能为空！");
        PageInfo pageInfo = new PageInfo(pageRequest.getPage(), pageRequest.getSize());
        // 利用数组拷贝
        int startIndex = pageRequest.getPage()*pageRequest.getSize();
        int nextTempEndIndex = startIndex + pageRequest.getSize();
        int endIndex = Math.min(nextTempEndIndex,list.size());
        List<T> ans = new ArrayList<>(endIndex-startIndex);
        for (int i = startIndex; i < endIndex; i++) {
            ans.add(list.get(i));
        }
        return new Page<T>(ans, pageInfo
                , list.size());
    }
}
